#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_SIZE 10       //数据最大长度
#define DATA_TYPE int     //数据类型

typedef struct sqlist
{
    DATA_TYPE arr[MAX_SIZE];
    int len;
}sqlist;

//创建一个空表
int creat_sqlist(sqlist *L);

//尾部添加一个数据
int tail_inset_tolist(sqlist *L,int data);

//中间指定位置插入一个数据 失败：返回 -1   成功：返回：0
int pos_insert_tolist(sqlist *L,int data,int pos);

//删除一个数据
int pos_del_fromlist(sqlist *L,int data);

//遍历
void show_list(sqlist *L);

//修改一个数据
int change_list(sqlist *L,int data);

//查找一个数据
int find_list(sqlist *L,int data);

//排序
int sort_list(sqlist *L);

int destroy(sqlist *L);

int main(int argc, char const *argv[])
{
    sqlist list;
    //创建一个空表
    creat_sqlist(&list);

    //尾插
    tail_inset_tolist(&list,1);
    tail_inset_tolist(&list,2);
    tail_inset_tolist(&list,3);
    tail_inset_tolist(&list,4);
    tail_inset_tolist(&list,5);
    //遍历
    show_list(&list);

    //指定位置插入
    pos_insert_tolist(&list,6,3);
    //遍历
    show_list(&list);

    //删除一个数据
    pos_del_fromlist(&list,3);
    //遍历
    show_list(&list);

    //修改一个数据
    change_list(&list,5);
    //遍历
    show_list(&list);

    //查找一个数据
    //find_list(&list,4);
    //遍历
    //show_list(&list);

    //排序
    sort_list(&list);
    //遍历
    show_list(&list);

    //销毁
    destroy(&list);
    show_list(&list);
  return 0;
}

//创建一个空表
int creat_sqlist(sqlist *L)
{
   L->len=0;
   //清空数据
   memset(L->arr,0,sizeof(L->arr));
   return 0;
}

//尾部添加一个数据
int tail_inset_tolist(sqlist *L,int data)
{
    if(L->len>=MAX_SIZE)//满了
    {
        printf("sqlist is full\n");
        return -1;
    }
    L->arr[L->len]=data;
    L->len++;

    return 0;
}

//中间指定位置插入一个数据 失败：返回 -1   成功：返回：0
int pos_insert_tolist(sqlist *L,int data,int pos)
{
    if(L->len>=MAX_SIZE)//满了
    {
        printf("sqlist is full\n");
        return -1;
    }
    if(pos<0||pos>L->len||pos>=MAX_SIZE)//插入位置不对
    {
        printf("pos if error\n");
        return -1;
    }
    for (size_t i = L->len; i >pos-1; i--)// i 在指定位置后一个时退出循环
    {
        L->arr[i]=L->arr[i-1];
    }
    L->arr[pos-1]=data;
    L->len++;
    return 0;
}

//删除一个数据
int pos_del_fromlist(sqlist *L,int data)
{
    int i;
    if(L->len==0)
    {
        printf("list is null\n");
        return -1;
    }
    for (i = 0; i < L->len; i++)
    {
        if(L->arr[i]==data)
        {
            break;
        }
    }
    if(i>=L->len)
    {
        printf("not find data\n");
        return -1;
    }
    for (; i < L->len-1 ; i++)//i 在要删除的位置
    {
        L->arr[i]=L->arr[i+1];
    }
    memset(&L->arr[L->len-1],0,sizeof(DATA_TYPE));
    L->len--;
    return 0;
}

//遍历
void show_list(sqlist *L)
{
    for (size_t i = 0; i < L->len; i++)
    {
        printf("%d\t",L->arr[i]);
    }
    printf("\n");
    return ;
}

//修改一个数据
int change_list(sqlist *L,int data)
{
    int i;
    if(L->len==0)
    {
        printf("sqlist is null\n");
        return -1;
    }
    i=find_list(L,data);
    printf("将%d修改为:",data);
    scanf("%d",&L->arr[i]);
    return 0;
}

//查找一个数据
int find_list(sqlist *L,int data)
{
    int i;
    for (i = 0; i < L->len; i++)
    {
        if(L->arr[i]==data)
        {
            return i;
        }
    }
    return 0;
}

//排序
int sort_list(sqlist *L)
{
    int temp;
    for (size_t i = 0; i < L->len-1; i++)
    {
        for (size_t j = 1; j < L->len-i; j++)
        {
            if(L->arr[j]<L->arr[j-1])
            {
                temp=L->arr[j];
                L->arr[j]=L->arr[j-1];
                L->arr[j-1]=temp;
            }
        } 
    }
    return 0;  
}

//销毁
int  destroy(sqlist *L)
{
    free(L);
    L=NULL;
    (L)->len=0;
    return 0;
}